class Observer {
    constructor() {
        this.message = {}
    }
    // 注册消息。订阅消息
    register(name, fn){
        if(!this.message.hasOwnProperty(name)){
            this.message[name] = [fn]
        }else {
            this.message[name].push(fn)
        }
        return this;
    }
    // 发布消息
    fire(name,...args){
        const fns = this.message[name]
        console.log(fns)
        if(!fns) {throw new Error('该方法未被注册！')}
        fns.forEach(fn=>{
            fn.call(this, ...args)
        })
        return this;
    }
    // 取消注册
    remove(name,fn){
        if(!this.message.hasOwnProperty(name)){
            return new Error('无该注册方法！')
        }
        // 下面两种方式都是可以的

        // this.message.forEach((item, index) =>{
        //     if(item === fn) {
        //         this.message.splice(index, 1)
        //     }
        // })

        // 通过一次for循环
        for (let i=0; i<fn.length; i++){
            this.message[name][i] === fn && this.message[name].splice(i, 1)
        }
        return this;
    }
}


function add(a, b){
    console.log(a + b )
}
function sub(a, b){
    console.log(a - b)
}

const observer = new Observer()
observer.register('add',add)
observer.register('sub',sub).fire('sub',1,2)

observer.fire('add', 1,2)
observer.fire('hoh',1)

